package com.himaci.framework;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;

/**
 * Kelas abstrak implementasi dari kelas Screen LibGDX
 * Tambahan atribut game, camera, dan spritebatch dalam screen
 *
 * @author XNPSDN
 */
public abstract class BaseScreen implements Screen {

    public static final int DEFAULT_WIDTH = 480;
    public static final int DEFAULT_HEIGHT = 320;
    public static final float MAX_DELAY = 0.2f;
    protected Game game;
    protected SpriteBatch batcher;
    protected OrthographicCamera camera;

    /**
     * Membuat kelas BaseScreen bar
     * Inisiasi camera dan spritebatch
     *
     * @param game Objek game
     */
    public BaseScreen(Game game) {
	this(game, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * Membuat kelas BaseScreen baru dengan resolusi kostum
     * Inisiasi camera dan spritebatch
     *
     * @param game Objek game
     * @param width Lebar screen (pixel)
     * @param height Tinggi screen (pixel)
     */
    public BaseScreen(Game game, int width, int height) {
	this.game = game;
	batcher = new SpriteBatch();
	camera = new OrthographicCamera(width, height);
	camera.position.set(width / 2, height / 2, 0);
    }

    @Override
    public void render(float deltaTime) {
	if (deltaTime > MAX_DELAY) {
	    deltaTime = MAX_DELAY;
	}
	update(deltaTime);
	present(deltaTime);
    }

    @Override
    public void dispose() {
	batcher.dispose();
	releaseResource();
    }

    /**
     * Main loop untuk update game world
     *
     * @param deltaTime Selisih waktu dengan loop sebelumnya
     */
    public abstract void update(float deltaTime);

    /**
     * Main loop untuk render game world
     * @param deltaTime Selisih waktu dengan loop sebelumnya
     */
    public abstract void present(float deltaTime);

    /**
     * Mengganti ukuran screen
     * @param width Lebar dalam pixel
     * @param height Tinggi dalam pixel
     */
    @Override
    public abstract void resize(int width, int height);

    /**
     * Method yang dipanggil saat screen dimunculkan
     */
    @Override
    public abstract void show();

    /**
     * Method yang dipanggil saat screen disembunyikan
     */
    @Override
    public abstract void hide();

    /**
     * Method yang dipanggil saat device pause
     */
    @Override
    public abstract void pause();

    /**
     * Method yang dipanggil saat device resume
     */
    @Override
    public abstract void resume();

    /**
     * Dispose seluruh resources disini
     */
    public abstract void releaseResource();
}
